1 JSBinding概述
说明:
JSBinding
是JS
和native
之间的一个桥梁,通过这个桥梁,JS
可以调用Native
,Native
可以调用JS
。注意:
JSBinding
不是什么
- not Hybrid
- not a new technology
历史:
cocos2D-X
使用zynga
提出的一个方案(https://github.com/zynga/jsbindings),`JS Engine使用的是
SpiderMonkey`。1.1 JS和Native
说明:两者结合初衷如下
原生静态语言 | 动态脚本语言 |
---|---|
高性能 | 简单易用 |
更底层,更强大 | 免编译 |
平台特性 | 热部署 |
1.2 iOS 7 and JavaScriptCore
说明:在
iOS 7
之后,苹果公布了JavaScriptCore
的API
,在这之前一直是iOS
系统私有的。
扩展:Mac
的JavaScriptCore
一直是开放的。
要点:包括以下部分
JavaScriptCore.h
头文件JSContext
类:JS
的运行环境JSValue
类:JSExport
类
1.2.1 Eval JavaScript Code
说明:利用引擎执行
JS
代码
1 |
|
1.2.2 Call JavaScript Function
说明:假设一个叫做
sum
的JS
方法已经被加载
1 | // a "sum" function was loaded in context |
1.2.3 Create JavaScript Value
说明:可以先创建
JS
的值,再赋值给相应变量。
1 | // 在指定上下文中创建值 231 |
another way
1 | [context evaluateScript: @"var bar = 231;bar++;"]; |
1.2.4 Type Conversion
说明:
JS
和O-C
之间对应类型的转换
Objective-C type | JavaScript type |
---|---|
nil | undefined |
NSNull | null |
NSString | string |
NSNumber | number, boolean |
NSDictionary | Object object |
NSArray | Array object |
NSDate | Date object |
NSBlock | Function object |
id | Wrapper object |
Class | Constructor object |
1.3 完整实例
1 |
|
2 初始iOS7 JavaScriptCore API
2.1 Call Native Code via Block
说明:
JS
调用Native
1 | //------------ JS 调用 Native |
2.2 Call Native Code via JSExport
说明:通过
jsExport
调用Native
- Create a js export Class in Objective-C(创建
jsExport
类)- the instance of this class can be accessed in js context(该类的实例可以在
js
的上下文中访问到)- No Constructor in JS(无法在
JS
中访问到JSExport
对象的构造函数)
###实例
说明:需要做以下工作
- 定义一个
JSExport
的子协议:协议指定的成员才能够暴露给JS
上下文- 创建一个
O-C
类,并采纳协议
Point3D.h
1 |
|
Point3D.m
1 |
|
main.m
1 | NSString *script; |
2.3 载入js文件来执行
说明:加入
js
文件比起在Native
代码中创建js
脚本子串要通用、易用的多。
1 | // 创建文件路径 |
3 JavaScriptCore API 进阶
3.1 Memory Leak
说明:
js
中对象的循环引用
和o-c
中对象的循环引用
都不会导致内存泄漏。但js
对象和Native
对象之间的循环引用会导致内存泄漏。
js
对象之间循环引用:不会内存泄漏o-c
对象和js
对象之间循环引用:会内存泄漏解决:
o-c
对象引用js
对象时将后者包装为JSManageredValue
JS Code
1 | var girl = new Girl(); |
Objective-C Code
1 | @implementation Boy |
3.2 Threding and parallelism
说明:要点
- API is thread safe(API是线程安全的)
- Locking granularity is JSVirtualMachine(锁的最小粒度为是
JS
虚拟机)- Use separate JSVirtualMachines for parallelism(并发时要使用不同的
JS
虚拟机)
###实例
说明:创建了2个虚拟机实例- jsvmA:运行了两个
js
上下文(ctxA1
和ctxA2
)- jsvmB:运行了一个
js
上下文(ctxB
)
ctxA1
和ctxA2
能够在并发情形下正常通信,但他们ctxB
在并发环境下不能通信。因为前两者在同一个虚拟机中运行,也就意味着运行在同一个线程中。
1 | // 创建 js 虚拟机实例 jsvmA |
3.3 JSBinding in the Real World
说明:
JSBinding
的一些实际应用。说明:2种
JS
引擎比较,JavaScriptCore
和SpiderMonkey
- JavaScriptCore
- SpiderMonkey(Cocos2D-iPhone-2.1-bate3)
- SpiderMonkey(Cocos2D-x-2.1-bate3)
- SpiderMonkey(iMonkey)
注意:
v8
引擎不受支持,因为其依赖于JIT
,被苹果禁用。3.3.2 JSBind VS LuaBinding
说明:
JSBinding
和LuaBinding
比较
LUA
为什么在游戏编程领域被广泛运用
https://www.zhihu.com/question/21717567Cocos2dx+LUA
合适还是Cocos2dx+JS
合适
https://www.zhihu.com/question/211303853.3.3 Which to Choose
- Native
- Web
- Hybrid
- ScriptBinding